Unix/Linux编程:Xinu中的进程
进程
创建和终止
操作系统提供创建新进程和结束现有进程的机制。Xinu操作中使用create创建一个新进程,它返回一个进程标志号:
procid = create(argument); // create a new process
如果要结束一个进程,可以调用kill
kill(procid); // terminate a process
信号量—同步
操作系统必须提供进程之间的相互通信的机制,比如:计数信号量semaphore、端口和消息传递
通常,计数信号量就是通用的进程同步机制。操作系统提供一个函数screate创建信号量,它返回一个信号量标识符,操作标识符必须用到这个信号量标识符
semid = screate(initcount);
每个信号量包含一个计数用的整数,调用者在创建信号量时赋予该整数一个初始值。一旦信号量产生,进程可以使用wait和siggnal系统调用来管理信号量。当进程调用wait时,操作系统对信号量的计数值减1,如果计数值变为负值,则进程被阻塞。当进程调用signal时,操作系统将信号量的计数值加1,如果有任何一个进程因该信号量被阻塞的话,此时这个进程将被重新激活
使用信号量可以提供“互斥机制”。程序员必须为所有受保护的代码提供一个信号量,其初始值为1
s = screate(1);
然后,用wait和signal语句将关键代码围起来:
wait(s);
// critical code
signal(s);
第一个进程执行wait(s)时,将信号量s的计数值减0,并继续执行(由于计算器此刻不为0)。如果进程结束,则执行signal(s),使s的计数值回到1.然而,如果第一个进程正在使用关键代码时,第二个进程调用wait(s),计数器值将变为负值,因此第二个进程将被阻塞。类似,如果此时碰巧还有第三个进程执行wait(s),计数器仍然为负值,则第三个进程也将被阻塞。当第一个进程执行完毕后,它将调用signal(s),给计数器值加1,唤醒第二个进程。第二个进程执行关键代码,此时第三个进程仍然在等待。当第二个进程结束后并执行了signal(s)后,第三个进程才能开始使用关键代码。其中心思想是任何时刻只能有一个进程执行关键代码,所有其他试图执行相同关键代码的进程都将被阻塞
除了提供互斥机制外,还可以利用信号量来保持队列访问的同步。由于队列的容纳有限,因此队列的同步也是必要的。假设一个队列空间也可以容纳N个数据项,由多个并发进程要将它们生成的数据置入该队列中(“生产者”)。与此同时我们假设另一组进程将从队列中提取数据并处理它们(“消费者”)。如果生产的速度比消费的速度快,那么队列最终将被装满。在队列全满的情况下,任何试图插入新元素的生产者必须被阻塞,以等待消费者从队列中取出一个数据项。同样,如果消费者速度更快,那么它可能会将队列中所有数据全部取出,那么此时它必须被阻塞,直到由数据被生成出来。在访问一个长度为N的队列时,需要两个信号量来调度生产者和消费者。这两个信号量初始化如下:
s1 = screate(N); // counts space in queue
s2 = screate(0); // counts items in queue
信号量被初始化后,生产者和消费者用他们来协调同步。一个生产者执行如下:
wait(s1); // wait for space
// ... insert item in next available slot...
signal(s2); // signal item available
消费者执行:
wait(s2); // wait for item in queue
// ... extract oldest item from queue
signal(s1); // signal space available
信号量保证了当队列全满时生产者进程被阻塞,当队列全空时消费者进程被阻塞。初次之外,生产者和消费者可以正常运行。
进程间通信
端口
在Xinu操作系统中,“端口”(port)这个抽象模型把进程的数据集中传送到一点处理。我们把端口看出是一个有限的消息队列,该消息队列有两个控制访问的信号量。程序调用pcreate函数生成一个端口,其入口参数指定队列的大小。pcreate返回一个端口标识符,用于引用该端口:
portid = pcreate(size); // create a port specifying size
生成一个端口后,进程可以调用psend和preceive来放置和取出端口中的数据项。psend过程向端口发送消息:
psend(portid, message); // send a message to a port
psend需要两个参数:一个端口标识号和一个要发送的单字消息(在TCP/IP中,消息经常是一个指针,执行某一分组)
preceive从端口提取一个消息:
message = preceive(port);
端口自带信号量机制:如果端口全满,则调用psend的进程被阻塞;如果端口全空,则调用preceive的进程被阻塞。一旦某个进程由于调用psend过程而被阻塞,那么它将保持阻塞状态,直到另一个进程调用了preceive为止。反之亦然。
为了使得进程能够判断psend是否会导致阻塞,系统提供了函数pcount,它允许进程检测一个端口是否已满:
n = pcount(portid); // find out whether a port is full
pcount返回该端口现有的数据项技术。如果返回值为0,则端口为空;如果返回值和端口的大小相等,则端口全满
消息传送
进程还可以通过消息传送来实现相互通信以及传送同步。消息传送运行一个进程直接将消息发送给另一个进程。进程通过调用send函数将消息发送给指定进程:
send(msg, pid); // send integer msg to process pid
一个进程调用receive来等待某个消息的到达:
message = receive(); // wait for msg and return it
在系统中,调用receive的进程将比阻塞,直到某个信息到达,而调用send函数的进程总是继续运行。如果在两次连续调用send之间没有进程调用receive函数以接收消息,那么第二次调用send函数时将返回SYSERR,而该消息无法发送。构造一个良好的系统以保证消息不会丢失的工作由程序员完成。为了协助消息交换的同步,程序可以使用函数recvelr,该函数删除所有正在等待被接收的消息,但不阻塞进程:
message = recvclr(); // clear message buffer;
由于大多数协议规定了等待确认的最长时间,因此在程序中经常会使用消息传送函数recetim,该函数是receive的翻版,但它允许调用者指明等待的最长时间。如果消息在此上限时间内到达,recvtim将其返回给调用者。否则,recetim返回一个特定代码TIMEOUT
message = recvtime(50);
Unix/Linux编程:Xinu中的进程相关推荐
- 学习Unix/Linux编程要学些什么
最近利用空余时间看了一下<Unix/Linux编程实践教程>,原书名为:Understanding Unix/Linux Programming: A Guide to Theory an ...
- 《Unix/linux编程实践教程》------重定向程序的I/O
<Unix/linux编程实践教程>书中举例命令more的用法: $more filename $command | more $more < filename 用法1直接显示fil ...
- Unix/Linux编程:进程间通信(IPC)总结
IPC工具分类 如上,Unix系统上IPC根据功能可以分为三类 通信:这些工具关注进程间的数据交换 同步:这些进程关注进程和线程操作之间的同步 信号:虽然信号的主要作用不为此,但是在特定场景下仍然可以 ...
- Unix/Linux编程实践教程–书评
花了两个月的时间把这本书读完了,完成了一部分的课后习题. 总的来说,这是一本挺好的Unix\Linux编程的入门书(虽然书中的小错误一大堆),书的开始部分简要介绍了Unix系统编程,讲述了如何使用男人 ...
- 如何在 Linux 命令行中终止进程?
如果你想在linux上停止某个进程,你会怎么操作? 如果命令/进程在前台运行,您可以使用 Ctrl+C 终端快捷方式,但是,如果进程不可见(在后台运行),您可以使用专用命令"杀死它" ...
- Unix/Linux编程:时间转换
unix time stamp翻译为时间戳, 就是从1970年1月1日00:00::00以来的秒数. 程序可能会关注两种类型的时间 真实时间.度量这一时间的起点有二: 其一为某个标准点. 也叫做日历时 ...
- stty详解-Unix/Linux编程实践教程第五章 学习stty
读书笔记-第五章 连接控制 学习stty 先放上思维导图 为设备编程&设备就像文件 前面所学的知识都是基于文件的,而在unix/linux系统中,所有的设备(打印机,终端,话筒,摄像头等等)也 ...
- Unix/Linux编程:Netlink机制
什么是Netlink通信机制 Netlink是linux提供的用于内核和用户态进程之间的通信方式. 但是注意虽然Netlink主要用于用户空间和内核空间的通信,但是也能用于用户空间的两个进程通信. 只 ...
- Unix/Linux编程:SIGHUP信号
当会话首进程打开了一个控制终端之后它同时也成为了该终端的控制进程:当一个控制进程失去其终端连接后,内核会向其发送一个SIGHUP信号来通知它这一事实(还会发送一个SIGCONT信号以确保当该进程之前被 ...
- hook 监控文件 c++_技术分享 | Linux 入侵检测中的进程创建监控
作者简介:张博,网易高级信息安全工程师. 0x00 简介 在入侵检测的过程中,进程创建监控是必不可少的一点,因为攻击者的绝大多数攻击行为都是以进程的方式呈现,所以及时获取到新进程创建的信息能帮助我们快 ...
最新文章
- webapi demo
- [Bash Shell] Shell学习笔记
- python语言中,对于cursor的查询明明有结果,为什么print cursor.rowcount结果为-1?
- Docker启动tomcat,访问首页出现404错误
- oracle trace 文件名,限制oracle trace 文件大小
- 华为交换机基本查询、目录、文件操作命令
- Junit4所需jar包
- GPU架构和Compute Shader线程规划
- matlab和keil下如何查找数组最大值的下标(角标)
- android 飞行模式 配置 wifi可用,飞行模式下使用WiFi教程
- 如何成为一个游戏制作人——教程企划
- 旷视科技完成4.6亿美元C轮融资,再破AI融资记录 | 聚焦
- python列表输出学生姓名学号链表_c语言!!!程序设计:建立一个学生信息链表,包括学号,姓名,成绩.(实现添加,删除,查询,排序,平均)...
- 双硬盘好还是纯固态好学计算机专业,电脑双硬盘好还是纯固态好?
- currentTimeMillis()的解释
- esp8266网络自动对时 串口字符连接 病显示 12864i2c u8g2库
- html c3效果,使用c3动画实现摇铃铛效果
- python二进制数据存入数据库_python+ mysql存储二进制流的方式
- 五十分钟带你看遍C语言初阶语法(总纲)
- requests接口测试