首页 > 系统相关 >进程与端口的系统设计题

进程与端口的系统设计题

时间:2023-12-13 15:12:45浏览次数:25  
标签:return int pid 端口 filterPid packetLen 进程 设计 port

#####题目
1. FlowStatsSystem

在一台计算机上运行着多个网络程序的进程,每个进程可以绑定多个端口,每个端口同一时刻只能被绑定在一个进程上,每个端口在绑定成功后可以接收网络报文。
请设计一个流量统计的简易系统,实现下面接口:
FlowStatsSystem() – 系统初始化。
bindport(int pid,int port) - 绑定一个端口port到进程pid上,如果此port已经被绑定,则绑定失败并且返回false;否则绑定成功,并返回true。
unbindPort(int port) - 解除端口port和进程的绑定关系。如果此端口已被绑定,则解除绑定,已接收的报文不清零,并返回true;否则直接返回false。
recvPacket(int port,int packetLen) -端口port上收到一段长度为packetLen的报文,
如果端口port没有被绑定在任何一个进程上,则直接返回0,报文丢弃。
如果端口port已绑定在某个进程上,则这个进程接收的[报文总长度]累加packetLen,然后返回[报文总长度]。
statPacket(int topNum) - 统计收到报文总长度最大的topNum个进程,并按如下规则返回这些进程pid的列表:
对于未接收过报文的进程,不统计。
优先按进程接收的[报文总长度]降序;若总长度相同,再按进程pid升序。
若符合条件的进程数不足topNum,按实际数量返回;若无符合条件的,返回空列表[]。

输入
每行表示一个函数调用,初始化函数仅首行调用一次,累计函数调用不超过100次。
1<=port<=65535,1<=pid<=100000,1<=packetLen<=100000,1<=topNum<=5
输出
答题时按照函数/方法原型中的要求(含返回值)进行实现,输出由框架完成(其中首行固定输出null)


思路:

注意到pid对应报文长度不会被清除。所以题目简化为 pid2Len,port2pid两个映射。 其中pid2Len为只增加的
关键问题就是排序

package main

import (
	"fmt"
	"sort"
)

type PidSystem struct {
	pid       int
	packetLen int
}

type FlowStatsSystem struct {
	ZERO    int
	portMap map[int]int // port => pid
	pidMap  map[int]*PidSystem // pid => pidSystem
}

func NewFlowStatsSystem() *FlowStatsSystem {
	return &FlowStatsSystem{
		ZERO:    0,
		portMap: make(map[int]int),
		pidMap:  make(map[int]*PidSystem),
	}
}

func (f *FlowStatsSystem) bindPort(pid int, port int) bool {
	if _, ok := f.portMap[port]; ok {
		return false
	} else {
		f.portMap[port] = pid
		return true
	}
}

func (f *FlowStatsSystem) unbindPort(port int) bool {
	if _, ok := f.portMap[port]; ok {
		delete(f.portMap, port)
		return true
	}
	return false
}

func (f *FlowStatsSystem) recvPacket(port int, packetLen int) int {
	if _, ok := f.portMap[port]; !ok {
		return f.ZERO
	}
	pid := f.portMap[port]
	pidSystem, ok := f.pidMap[pid]
	if !ok {
		pidSystem = &PidSystem{pid: pid, packetLen: f.ZERO}
		f.pidMap[pid] = pidSystem
	}
	pidSystem.packetLen += packetLen
	return pidSystem.packetLen
}

func (f *FlowStatsSystem) statPacket(topNum int) []int {
	var filterPid []*PidSystem
	for _, v := range f.pidMap {
		if v.packetLen > 0 {
			filterPid = append(filterPid, v)
		}
	}
	if len(filterPid) == f.ZERO {
		return []int{}
	}
	sort.Slice(filterPid, func(i, j int) bool {
		if filterPid[i].packetLen == filterPid[j].packetLen {
			return filterPid[i].pid < filterPid[j].pid
		}
		return filterPid[i].packetLen > filterPid[j].packetLen
	})
	res := make([]int, len(filterPid))
	for i, v := range filterPid {
		res[i] = v.pid
	}
	if len(res) > topNum {
		return res[:topNum]
	} else {
		return res
	}
}

func main() {
	flowStatsSystem := NewFlowStatsSystem()
	flowStatsSystem.bindPort(23215, 443)
	flowStatsSystem.bindPort(23215, 443)
	flowStatsSystem.bindPort(23215, 3306)
	flowStatsSystem.bindPort(23216, 3306)
	flowStatsSystem.bindPort(23216, 80)
	flowStatsSystem.recvPacket(3306, 100)
	flowStatsSystem.recvPacket(443, 200)
	flowStatsSystem.recvPacket(80, 300)
	flowStatsSystem.unbindPort(443)
	ints := flowStatsSystem.statPacket(2)
	fmt.Println(ints)
}




#### 感受
1. 设计能力薄弱,只能设计到portMap(port => pid),但是没办法pidMap(pid => pidSystem)中使用 map结构体
2. 经典排序Top问题, 先排序,然后取top(如果len小于top,取全部)// 默写100次
3. 1->n; n->1 主键都在n里面 n->m 需要新增一张表

标签:return,int,pid,端口,filterPid,packetLen,进程,设计,port
From: https://www.cnblogs.com/gongxianjin/p/17899039.html

相关文章

  • 今天聊一聊高性能系统架构设计是什么样的
    Java全能学习+面试指南:https://javaxiaobear.cn今天聊一聊大家常听到的高性能系统架构。高性能系统架构,主要包括两部分内容,性能测试与性能优化。性能优化又可以细分为硬件优化、中间件优化、架构优化及代码优化,知识架构图如下。性能测试先看系统的性能测试。性能测试是性能优......
  • F. 纪念品 - 2023HBUCM程序设计竞赛/CSP-J2019
    题面小伟突然获得一种超能力,他知道未来\(T\)天\(N\)种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。每天,小伟可以进行以下两种交易无限次:任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;卖出持有的......
  • Apollo 4 客户端 SDK 设计
    前言之前聊了客户端的一些功能,例如融入Spring,@value注解的自动刷新实现,长轮询等,这次从客户端的整体设计来聊聊。设计上图是client项目的包结构。其中,核心包就是internals包,包含了客户端的主要功能逻辑。主要有以下功能:0.获取ConfigService服务的远程配置。长轮......
  • 杀死进程
    kill-9pid:杀死一个进程;kill-15pid:终止一个进程;这么描述这两个东东的定义似乎不太好理解,那么举个栗子:你现在在码字,然后你对象说快把洗衣机里面的衣服晾一下,你回答说“好的,等我把这点写完就去”,这个场景就相当于 kill-15pid的执行过程,当收到signal之后不是立马结束而是......
  • 80端口被占用
    在进行JFinal程序编程的时候遇到了80notavailable的报错 即,80端口被占用通过 netstat-ano|findstr80发现是被PID为860的端口占用了 再输入 tasklist|findstr860发现是以下几个应用占用 其中svchost.exe是从动态链接库(DLL)中运行的服务的通用主机进......
  • DAMON —— 设计 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/mm/damon/design.html设计整体架构DAMON子系统配置了三层,包括操作集:实现了依赖于给定监控目标地址空间和可用软硬件原语的DAMON基本操作,核心:在操作集层之上实现了核心逻辑,包括监控开销/准确性控制和访问感知系统操作,模块:在......
  • 【架构】事件驱动设计遇上事件溯源
    From:现代软件架构:事件驱动设计遇上事件溯源(qq.com) 在当今的软件领域中,做出正确的架构决策对于确保性能、可扩展性、可维护性和整体成功至关重要。在众多模式中,事件驱动架构(EDA)和事件溯源(ES)作为复杂软件系统最受欢迎的两种选择之一。虽然可以单独使用EDA或ES,但它们的结合可......
  • Python学习多线程、多进程、多协程记录
    一、多线程应用于请求和IO#1.Python中关于使用多线程多进程的库/模块#2.选择并发编程方式(多线程Thread、多进程Process、多协程Coroutine)前置知识: 一、三种有各自的应用场景 1.一个进程中可以启动多个线程 2.一个线程中可以启动多个协程 二、各自优缺点 1......
  • 进程间通信-信号-pipe-fifo
    进程间通信-信号-pipe-fifo编译fifo文件夹的程序运行fifo文件夹的程序代码说明1.consumer.c文件包含一个用来从FIFO(命名管道)读取数据的C程序。以下是它的主要组件和系统调用的分解:main()函数:初始化文件描述符(pipe_fd)、返回状态(res)、读取数据的缓冲区以及字节数计......
  • 界面设计学习
    界面设计学习总体设计做一个网站首先要明白它的网页设计步骤:确定网站主题分析网站的功能,将网站所有的功能在文档中体现。分析网站的主题,选择符合网站主题的方法。编写步骤:先用html写出结构。用CSS写出样式。用js写出动态效果。功能图详细设计整体分析局部分......