首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Operating System 05 - 进程通信

进程通信 进程通信范式 持锁共享内存 在这种范式下, 两个或者多个进程可以同时读写一块或者多块常规内存区域....有时进程需要在这些内存区域执行一些具有原子性的操作序列, 其他进程在操作完成前不得访问这些区域, 这就需要一种令该进程阻止其他进程访问这些区域的方法, 也就是锁....使用锁的进程之间必须通力合作: 所有进程必须先获取锁才能访问共享内存区域, 访问结束后还需要将锁归还给其他进程使用....在确定进程成功前, 需要额外的内存来存放试图写入的数据. 从编程人员角度而言, STM对可控性高于使用锁, 其本质是持有锁的共享内存的变体, 他在操作系统层面的操作要甚于编程层面....消息传递 消息传递意味这接收进程实际获取了一份独立的数据副本, 发送方感知不到接收方对副本所做的任何操作. 向发送方回传信息的唯一途径就是反向发送另一条消息.

31810

Operating System 03 - 孤儿进程与僵尸进程

孤儿进程与僵尸进程 孤儿进程 一个父进程退出, 而他的一个或者多个子进程还在运行, 那么这些子进程将成为孤儿进程....孤儿进程将被init(进程号为1)所收养, 并有init进程对他们完成状态收集工作. 由于孤儿进程会被init收养, 所以孤儿进程不会对系统造成危害....僵尸进程 一个子进程进程描述符在子进程退出不会释放, 只有当父进程通过wait()或者waitpid()获取了子进程信息后才会释放....如果子进程退出, 而父进程并没有调用wait()或者waitpid(), 那么子进程描述符仍然保存在系统中, 这种进程称之为僵尸进程. 僵尸进程通过ps命令显示出来的状态为Z(zombie)....要消灭系统中大量的僵尸进程, 只需要将其父进程杀死, 此时僵尸进程就会变为孤儿进程, 从而被init收养, 这样init就会释放掉所有的僵尸进程所占有的资源, 从而结束僵尸进程.

51520
您找到你想要的搜索结果了吗?
是的
没有找到

Operating System 01 - 进程同步

进程同步 临界区 对临界资源访问的区域被称为临界区....同步与互斥 同步: 多个进程按一定顺序执行. 互斥: 多个进程在同一时刻只有一个进程能进入临界区....因此empty信号量在生产者进程中使用, 当empty不为0时, 生产者才能放入物品; ful信号量在消费者进程中使用, 当full不为0时, 消费者才能拿走物品....end; end monitor; 管程有一个重要特性: 在一个时刻只能有一个进程使用管程. 进程在无法继续执行的时候不能一直占用管程, 否则其他进程永远不能使用管程....对条件变量执行wait()操作会导致调用进程阻塞, 把管程让出来给另一个进程持有. singal()操作用于唤醒被阻塞的进程. monitor ProducerConsumer condition

40610

Operating System 08 - 进程与线程

进程与线程 进程 进程是资源分配的基本单元. 进程控制块(Process Control Block, PCB)描述进程的基本信息和运行状态, 所谓的创建进程和撤销进程, 都是对于PCB的操作....一个进程中可以有多个线程, 他们共享进程资源. 区别 拥有资源 进程是资源分配的基本单位, 但是线程不拥有资源, 线程可以访问隶属进程的资源....调度 线程是独立调度的基本单位, 在同一进程中, 线程的切换不会引起进程切换, 从一个进程内的线程切换到另一个进程的线程时会引起进程的切换....类似的, 在进行进程切换, 设计当前执行进程CPU环境的保存以及新调度进程CPU环境的设置, 而线程切换时只需要保存和设置少量寄存器内容, 开销很小....通信方面 进程间通信(IPC)需要进程同步和互斥手段的辅助, 以保证数据的一致性. 而线程间可以通过直接读/写同一进程中的数据段(如全局变量)来进行通信.

23810

System|并发|进程线程协程综述

,内存不足时将物理内存复制在磁盘上或者压缩 COW,fork时标记write保护,写时page fault复制,引用计数为1则不复制 内存去重,反向COW,将内容相同的物理页合并为COW页 绑核,避免进程在其他核运行...事实,地址空间本身就是一种capability IPC 进程通过独占地址空间实现了隔离,然而,某些时候,我们希望进程之间协作。...可见性 为了确保多核之间的可见性,我们需要使得对象分配在内存而非寄存器,从而经由缓存一致性协议。通过在对象前增加volatile保证。...线程的结构体存在于内核中,在pthread_create时需要进入内核态,频繁创建开销大 从空间角度: 线程的栈空间通常在MB级别,而服务器往往只是无状态地转发,并不需要这么大的栈空间 线程利用TCB存储上下文和调度状态..., update_pending_co->save_buffer, update_pending_co->save_size); } } } 无栈协程 无栈协程的特点在于所有的协程都运行在系统栈

32020

Linux进程间通信之System V

system V通信的3种通信方式: 1.system V共享内存 () 2.system V消息队列 () 3.system V信号量 () 上述中的共享内存和消息队列主要用于传输数据,而信号量则是用于保证进程间的同步与互斥...system V共享内存: 共享内存的基本原理: 之前说的到了通信的原理都是让不同的进程看到同一份资源,共享内存让进程看到同一份资源的方法就是,在物理内存中申请一块空间,名为共享内存,然后让这块空间与需要通信的进程的页表建立映射...V消息队列: 消息队列基本原理: 消息队列实际就是在系统当中创建了一个队列,队列当中的每个成员都是一个数据块,这些数据块都由类型和信息两部分构成,两个互相通信的进程通过某种方式看到同一个消息队列,这两个进程向对方发数据时...system信号量: 信号量相关概念: 由于进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系叫做进程互斥。...实际,代码中计数器sem减减的操作就叫做P操作,而计数器加加的操作就叫做V操作,P操作就是申请信号量,而V操作就是释放信号量。 感谢阅读!

7610

4.5 服务器的 Git - Git 守护进程

请注意,因为其不包含授权服务,任何通过该协议管理的内容将在其网络公开。 如果运行在防火墙之外的服务器,它应该只对那些公开的只读项目服务。...如果运行在防火墙之内的服务器,它可用于支撑大量参与人员或自动系统(用于持续集成或编译的主机)只读访问的项目,这样可以省去逐一配置 SSH 公钥的麻烦。...通常,你只需要以守护进程的形式运行该命令: git daemon --reuseaddr --base-path=/opt/git/ /opt/git/ --reuseaddr 允许服务器在无需等待旧连接超时的情况下重启...你可以通过许多方式将该进程以守护进程的方式运行,这主要取决于你所使用的操作系统。 在一台 Ubuntu 机器,你可以使用一份 Upstart 脚本。...接下来,你需要告诉 Git 哪些仓库允许基于服务器的无授权访问。 你可以在每个仓库下创建一个名为git-daemon-export-ok 的文件来实现。

1.9K30

如何使用Fluent Design System ()

前言 微软在Build 2017中公布了新的设计语言Fluent Design System(以下简称FDS),不过官网只是堆砌了各种华丽的词语以及一堆动画。...Fall Creators Update中的Fluent Design System 本文主要介绍微软在Fall Creators Update中主打的各种FDS特效、控件。...但我觉得重申这个主题十分重要,UWP诞生的目的就是为了打造能在各种设备运行的通用应用,伸缩性对UWP至关重要。即使只针对桌面设备,能有各种输入方式对可用性都有很大提高。... 3.2 将内容扩展到标题栏 在程序启动或每次更改主题颜色时调用SetupTitlebar()这个函数,注意要根据当前主题颜色改变TitleBar按钮的颜色...(因为官方文档没有,所以很多人会忘了处理按钮的颜色): private static void SetupTitlebar() { if (ApiInformation.IsTypePresent

2.4K30

进程通信(二)消息队列(System V 消息队列)

一、System V 消息队列简介 消息队列:消息队列的本质是由Linux内核创建用于存放消息的链表,并且其功能是用来存放消息的,所以又称之为消息队列。...在Linux的不同进程中,包括有血缘的进程和无血缘的进程,都可以通过Linux消息队列API所得到的消息队列唯一标识符对消息队列进行操作。...int msg_lspid; //最近一次向消息队列发送消息进程的pid int msg_lrpid; //最近一次从消息队列接受消息进程的pid }; 消息队列节点的结构: struct msg...msgctl 4.int msgctl(int msqid, int cmd, struct msqid_ds* buff); msgctl接口可以使得进程在msqid所标识的消息队列上进行各种控制操作...四、代码实战 (1)有血缘关系的进程间通信 #include #include #include #include

2.4K20

【Linux】进程信号()

kill -l 查看信号列表 可以发现在31 和34之间没有信号存在,说明信号被划分为两部分,1-31以及34-64 34-64称之为实时信号,\ 1-31称之为普通信号,是目前要学习的信号 数字实际是真正的信号...return 0; } ---- 复制SSH渠道创建终端2,在保证运行终端1的可执行程序的情况下, 在终端2中输入 kill -9 +pid值 ,终止了终端1中运行的程序 ---- 实际...键盘是通过硬件中断的方式,通知系统键盘已经按下了 ---- CPU存在很多针脚,有自己的编号,接到主板 键盘是通过中断控制器(如8259)连接到CPU的, 当按键盘中的某个位置时,操作系统要知道是哪个设备按下的...---- alarm函数返回值是0或者以前设定的时间还余下的秒数 假设你想睡一觉,设定闹钟30分钟后响,但是在20分钟后你被吵醒了,你又重新设置闹钟15分钟后响 此时返回值就是一次余下的10分钟...---- 修改mykill.cc文件内容 计算1S中计算机会将整数累计到多少 ---- 在这次计算中,count只有11万多,非常不符合我们的预期 因为要打印到显示器,以及网络问题,非常拖延速度

14220

进程和线程(

进程的特点有: 操作系统以进程为单位分配存储空间, 每个进程有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据; 进程可以通过 fork 或者 spawn 方式创建新的进程来执行其他任务 进程都有自己独立的内存空间...当要实现并发编程,也就是同时执行多任务时,有以下三种解决方案: 多进程,每个进程只有一个线程,但多个进程一起执行多个任务; 多线程,只启动一个进程,但一个进程内开启多个线程; 多进程+多线程,即启动多个进程...,每个进程又启动多个线程,但这种方法非常复杂,实际很少使用 注意:真正的并行执行多任务只有在多核 CPU 才可以实现,单核 CPU 系统中,真正的并发是不可能的,因为在某个时刻能够获得CPU的只有唯一的一个线程...子进程返回的永远是 0 ,而父进程会返回子进程的 ID,因为父进程可以复制多个子进程,所以需要记录每个子进程的 ID,而子进程可以通过调用 getpid() 获取父进程的 ID。...子进程 大多数情况,子进程是一个外部进程,而非自身。在创建子进程后,我们还需要控制子进程的输入和输出。 subprocess 模块可以让我们很好地开启子进程以及管理子进程的输入和输出。

72410

进程和线程(

进程的特点有: 操作系统以进程为单位分配存储空间, 每个进程有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据; 进程可以通过 fork 或者 spawn 方式创建新的进程来执行其他任务 进程都有自己独立的内存空间...当要实现并发编程,也就是同时执行多任务时,有以下三种解决方案: 多进程,每个进程只有一个线程,但多个进程一起执行多个任务; 多线程,只启动一个进程,但一个进程内开启多个线程; 多进程+多线程,即启动多个进程...,每个进程又启动多个线程,但这种方法非常复杂,实际很少使用 注意:真正的并行执行多任务只有在多核 CPU 才可以实现,单核 CPU 系统中,真正的并发是不可能的,因为在某个时刻能够获得CPU的只有唯一的一个线程...子进程返回的永远是 0 ,而父进程会返回子进程的 ID,因为父进程可以复制多个子进程,所以需要记录每个子进程的 ID,而子进程可以通过调用 getpid() 获取父进程的 ID。...子进程 大多数情况,子进程是一个外部进程,而非自身。在创建子进程后,我们还需要控制子进程的输入和输出。 subprocess 模块可以让我们很好地开启子进程以及管理子进程的输入和输出。

61210

【Linux】进程概念()

进程概念 一、冯诺依曼体系 我们常见的计算机,如笔记本。或者不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。 从输入到输出的顺序是按照上面的数字顺序的。...,实际就是 PCB 在某个队列中在排队,例如有一个运行队列: 所以准确地来说,进程 = 可执行程序 + 内核数据结构(PCB);其中 PCB 是方便操作系统对进程进行管理的。...: 过了一会后我们再查看: 此时只剩下子进程了,而且它的 ppid 变成了 1,也就是它被 1 号进程领养了,1 号进程其实就是 init / system 进程,也就是操作系统。...每一个进程并不是占有CPU就一直运行,每隔一段时间,会自动被从CPU剥离下来,这段时间称为时间片;但是Linux内核中不仅仅只有时间片,因为只有时间片的话会显得太呆板,假设每个进程都运行1ms就下来,...假如我们有一个10000行代码的程序,在时间片内运行了1000行代码,然后进行进程切换,那么当下一次又到这个进程调度的时候,cpu怎么知道我一次运行到哪里呢?

10510

进程服务器

一、思路 先与客户端建立好连接, 每次监听到一个客户端之后,都需要产生一个子进程去处理这个连接,然后父进程继续去等待监听,唯一一个要注意的点就是要使用信号来监听子进程是否结束,从而对其进行回收,防止僵尸进程的产生...&opt, sizeof(opt)); (3)bind函数 bind(lfd, (struct sockaddr*)&ser_addr, sizeof(ser_addr));b这个函数主要目的就是将服务器的地址结构绑定到套接字...lfd,所以开始要设置服务器的ser_addr:ser_addr.sin_family = AF_INET, ser_addr.sin_port = htons(8888);ser_addr.sin_addr.s_addr...监听到了客户端后,就要开始创建子进程来对这个监听进行处理;pid = fork() 3、子进程处理通信 因为子进程不需要监听连接,使用可以close(lfd);之后便可以进行通信处理 void do_work...sizeof(buf)); tcp.Write(cfd, buf, n); tcp.Write(STDOUT_FILENO, buf, n); } } 4、父进程回收子进程

4.7K20
领券