uc14

回顾:
  网络编程 - TCP 、UDP
  TCP一对多的编程步骤:
  Server:
   1 socket()
   2 struct sockaddr_in
   3 bind()
   4 listen()
   5 在循环中调用 accept()
   6 读写操作: read() write() send() recv()
   7 close()
  Client:
   1 2 一样
   3 connect(),语法和 bind()一样
   4 5 一样
  UDP编程步骤:(发送方/接收方)
   Server:
   1 socket()
   2 struct sockaddr_in
   3 bind()
   4 读写操作:sendto() recvfrom() read()
   5 close()
   Client:
    不需要bind(),其他的一样。
今天:
   线程
   网络一般都需要实现代码的并行,代码的并行必须借助多进程/多线程。
   进程和线程的概念
   主流操作系统中都是支持多进程,而在每个进程的内部,都支持多线程并行。
    进程,重量级的,拥有自己独立的内存空间。
    线程,轻量级的,不需要拥有自己独立的内存空间,只是额外拥有一个独立的栈。一个进程内存的所有线程共享进程的资源(代码区、全局区、堆、文件目录....) 。
   因此网络开发经常是 网络+多线程 模式。
   进程中支持多线程并行,其中有一个是主线程,进程中必须有主线程(main函数)。
   计算机程序运行的硬件必备:CPU/内存,如果要并行,意味着CPU和内存 都应该可分。内存可分,CPU不可分,那么多线程 怎么并行?主流操作系统采用CPU时间片技术实现 多线程的并行。人的感知是需要时间的,这种时间属于时间段,比如0.1秒,对于计算机来说,0.1秒可以分为100毫秒。把100毫秒的CPU执行时间 分成100个 CPU时间片,每个 1毫秒。假如有4个线程并行,每个线程分1片,4毫秒以后,每个线程都运行了1毫秒。针对时间点来说,线程没有并行;针对时间段来说,利用CPU时间片技术可以实现并行。
   多线程之间互相独立,但又互相影响。
   主线程一旦结束,进程随之结束,进程结束导致所有线程结束。
   多线程之间 代码是 乱序执行,每个线程内部的代码 是顺序执行。
   
   线程的实现:(thread)
   POSIX规范中对线程做了比较完善的定义,因此,线程编码使用 pthread.h,几乎所有的函数都以pthread_ 开头。代码在libpthread.so中。 
 比如:创建线程的函数:
  pthread_create()
   4个指针类型做参数
  第一个参数:用于存储pthread_t 类型的线程ID
  第二个参数: 线程属性,一般为0即可(默认属性)
  第三个参数和第四个参数联合使用,第三个参数是函数指针,把 线程需要执行的代码写在函数中,函数的参数由 第四个参数提供。
   void* (*fun) (void*)
  返回,成功返回0,失败返回错误码。线程的函数错误处理通过返回错误码的方式,而不是 使用errno。
   pthread_join()可以让一个线程等待另外一个线程结束,并且取得结束线程的返回值。(类似wait)
   在使用线程的参数时,必须保证参数的指向有效。
  关于函数/线程的返回值:
   1 不能直接以数组做返回类型。
   2 能返回局部变量
   3 不能返回指向局部变量的指针。
   4 加了static的变量 指针可以返回。
  线程的返回值必须是一个有效的指针。
   全局变量、常量、传入的指针、static的局部变量
  线程的返回值可以pthread_join的第二个参数取得
  pthread_join(pthread_t id,void** retval)
  取返回值时,相当于代码:
   *(retval) = 线程的返回值
  线程的结束:
   正常结束:
    线程函数结束
    pthread_exit(void* retval),与return一样
   非正常结束:
    出错/被其他线程取消
  注:exit()结束的是进程,所以不能用于结束线程
  线程的状态:
   线程在启动后,可以通过不同的函数进入不同的状态:
   pthread_join() 进入非分离状态(同步),非分离状态的线程会在pthread_join()结束后回收线程资源
   pthread_detach() 进入分离状态(异步),分离状态的线程会在线程结束后直接回收线程的资源。
   已经处于分离状态的线程 join()没有效果。
   线程最好 处于这两种状态其中的一种。
 
   线程取消(了解)
    线程的取消就是给目标线程发 CANCEL信号,目标线程可以做出3种选择:
    忽略、立刻停止、过一会再停止
    线程取消的相关函数:
     pthread_cancel() 给目标线程发取消信号
     pthread_setcancelstate() 设置是否支持取消
     pthread_setcanceltype() 设置取消的方式
   
   线程的同步
    因为多线程共享进程的资源,在访问共享的资源时,就有可能出现互相覆盖的情况,叫 共享数据冲突。解决共享数据冲突的技术叫 线程同步,解决方案就是把 共享资源的访问代码由 并行 改为 串行,其他代码无所谓。线程同步 会降低线程的效率,因此使用时不是范围越大越好。
    互斥锁/互斥量 就是其中的一种方案。我们可以在访问共享资源时加上互斥锁,访问共享资源结束后释放互斥锁,就可以把并行改为串行。确保只有一个进程访问。互斥锁是 线程规范的一个组成部分。
   互斥量的使用步骤:
    1 声明互斥量 pthread_mutex_t lock;
    2 初始化互斥量
     pthread_mutex_init(&lock,0);
   或者在声明的同时初始化:
     pthread_mutex_t lock=
      PHTREAD_MUTEX_INITIALIZER;
    3 加锁 pthread_mutex_lock(&lock);
    4 访问,使用,读写
    5 解锁 pthread_mutex_unlock(&lock);
    6 销毁锁(释放资源)
     pthread_mutex_destroy(&lock);

@startuml left to right direction skinparam rectangleBackgroundColor #E0E0E0 skinparam usecase { BackgroundColor #FFFFFF BorderColor #333333 } ' 完全隐藏所有构造型显示 skinparam stereotype { Visibility false } ' 直接为每个用例设置颜色 skinparam usecase { BackgroundColor<<blue>> #BBDEFB BorderColor<<blue>> #1976D2 BackgroundColor<<orange>> #FFCCBC BorderColor<<orange>> #E64A19 } actor 用户 as User rectangle "网络安全态势感知平台" { (登录系统) as UC1 <<blue>> (注册) as UC2 <<orange>> (查看安全态势仪表盘) as UC3 <<blue>> (查看实时告警) as UC4 <<orange>> ' ... 其余用例定义保持不变 (多源数据采集) as UC5 <<blue>> (数据解析与标准化) as UC6 <<orange>> (威胁情报融合) as UC7 <<blue>> (安全事件分析) as UC8 <<orange>> (风险监测与评估) as UC9 <<blue>> (修改风险阈值) as UC10 <<orange>> (异常行为检测) as UC11 <<blue>> (动态基线管理) as UC12 <<orange>> (终端安全管控) as UC13 <<blue>> (外设与端口管理) as UC14 <<orange>> (安全预警与通知) as UC15 <<blue>> (分级响应处置) as UC16 <<orange>> (态势评估报告生成) as UC17 <<blue>> (导出评估报告) as UC18 <<orange>> (攻击仿真测试) as UC19 <<blue>> (仿真结果分析) as UC20 <<orange>> (可视化图表交互) as UC21 <<blue>> (下钻分析) as UC22 <<orange>> } ' 关系定义保持不变... User --> UC1 : 登录 User --> UC3 : 查看仪表盘 User --> UC5 : 数据采集 User --> UC7 : 威胁融合 User --> UC9 : 风险评估 User --> UC11 : 异常检测 User --> UC13 : 终端管控 User --> UC15 : 预警通知 User --> UC17 : 报告生成 User --> UC19 : 攻击仿真 User --> UC21 : 图表交互 UC1 <.. UC2 : <<extend>> UC3 ..> UC4 : <<include>> UC5 ..> UC6 : <<include>> UC7 ..> UC8 : <<include>> UC9 <.. UC10 : <<extend>> UC11 ..> UC12 : <<include>> UC13 ..> UC14 : <<include>> UC15 ..> UC16 : <<include>> UC17 <.. UC18 : <<extend>> UC19 ..> UC20 : <<include>> UC21 ..> UC22 : <<include>> @enduml修改代码
最新发布
08-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值