进程及其相关接口函数

一、进程

程序:静态的

是有序数据指令的集合

进程:

是系统分配资源的总称,进程是程序执行的一次完成过程(创建、调用、执行、消亡)

程序的组成:

正文段、用户数据段

1、进程的组成:

正文段、用户数据段、系统数据段(PCB(进程控制块),pc,堆栈)

PCB:

进程ID

用户名、用户组名

进程的状态、优先级

文件描述符表

pc(程序寄存器):

记录程序下一条指令的地址

堆栈(栈)

2、进程的类型

1、交互进程:跟终端相关,可以在前台进行,也可以在后台进行

2、批处理进程:跟终端无关,可以将指定的进程放在一个工作队列中按顺序进行,一般由系统管理员

3、守护进程:跟终端无关,在后台一直循环执行任务

3、进程的状态

R -- 运行态(就绪态):正在运行或者准备运行的进程

等待态:两种等待态区别在于是否能被信号打断

S -- 可中断等待态:等待某种资源,有资源之后继续执行

D -- 不可中断等待态

T -- 暂停态:暂停运行,直到有信号唤醒位置

Z -- 僵尸态:进程结束之后,没有进行资源回收,该进程状态变为僵尸态

4、进程相关指令

ps -ef :查看当前系统状态

ps -aux :查看当前系统进程,还会显示当前进程状态

top:每隔三秒,显示进程的实时信息

5、进程的优先级

进程优先级取值范围:-20 ~ 19 默认值:0

nice -n 优先等级 ./a.out //在准备运行时,将a.out的优先等级设为2

renice -n 2 进程号 //在运行过程中,将指定进程号的进程的优先级设为2

6、前后台进程切换

./a.out & //将a.out在后台运行

bg +任务号 // 将后台挂起的任务唤醒

fg + 任务号 // 将后台运行的进程切换到前台

jobs // 查看后台任务

二、进程相关接口函数

1、创建子进程--fork()

       #include <sys/types.h>
       #include <unistd.h>

       pid_t fork(void);
返回值:
    成功创建一个新的子进程,父进程返回子进程的PID号,子进程返回0
    失败父进程返回-1,没有子进程被创建

父子进程:

一个进程通过fork函数创建一个新的进程,原本进程称为新进程的父进程,新的进程称为原进程的子进程

子进程会继承父进程中几乎所有的数据

1、如果父进程优先于子进程结束:

        子进程称为孤儿进程,由前台进程变为后台进程,统一由init进行收养

2、如果子进程优先于父进程结束,且父进程没有回收子进程资源:

子进程状态变为僵尸态

        一般来说,如果子进程先于父进程结束,子进程应该同意由父进程回收

子进程在fork语句的下一条指令开始执行

 

2、结束进程 -- exit() / _exit()

       #include <stdlib.h>

       void exit(int status);

参数:
	status:表示进程退出的状态

 

       #include <unistd.h>

       void _exit(int status);

注意: exit函数调用后会刷新所有缓冲区,_exit函数不会刷新

3、进程回收 -- wait 、waitpid

       #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *wstatus);
参数:
    wstatus:进程结束时,状态信息的首地址
返回值:
    成功返回结束子进程的pid号,失败返回-1
    
    如果想要得到子进程的状态信息,可以用以下宏来得到:
    
        WIFEXITED(wstatus) -- 判断一个子进程是否是正常退出,正常退出为真,非正常退出为假
   		WEXITSTATUS(wstatus)  -- 返回子进程结束的返回值
   		WIFSIGNALED(wstatus) --  判断是否被信号终止
   		WTERMSIG(wstatus) -- 打印终止进程信号的编号 
    
    

       #include <sys/types.h>
       #include <sys/wait.h>

       pid_t waitpid(pid_t pid, int *wstatus, int options);

参数:
    pid:进程号, -1表示接受任意进程
    wstatus:进程结束时,状态信息的首地址
    options:
    		0 -- 以阻塞方式等待子进程结束
   		    WNOHANG  -- 以非阻塞方式等待子进程结束
    		

 

4、exec函数族

        #include <unistd.h>

l:list列表
v:argv
p:PATH环境变量
       
       int execl(const char *pathname, const char *arg, .../* (char  *) NULL */);
参数:
    pathname:执行程序的文件名(包含路径)
    arg:表示执行程序的命令行参数,命令行参数列表以NULL结尾
返回值:
    失败返回-1
    
       int execlp(const char *file, const char *arg, .../* (char  *) NULL */);

参数:
	file:程序名
        
添加环境变量:
    在~/.bashrc中添加命令
    export PATH=$PATH:/home/hqyj/class/220703_IO/day4
   		配置完成之后,需要用以下指令让配置生效:
   			source ~/.bashrc
        
        
       int execv(const char *pathname, char *const argv[]);
       int execvp(const char *file, char *const argv[]);
	

5、守护进程

守护进程跟终端无关,负责在后台周期性的处理某些事件或者等待某些事件响应

(1)进程组:当用户执行一个程序时,就相当于创建了一个进程组,跟该进程具有情缘关系的所有进程都属于该进程组

(2)会话:当用户打开一个终端时,就创建了一个会话,一个会话由一个或者多个进程组组成,一旦终端关闭,该会话中所有进程组中的进程全部结束

 

守护进程的创建流程:
		1、创建子进程,父进程退出
			fork();
		2、让子进程脱离原本会话;
            setsid();
		3、修改当前工作路径 -- 非必要
            chdir("/");
		4、重设文件权限掩码 -- 非必要
            umask(0);
		5、删除进程中所有的文件描述符
            getdtablesize();
			
			int i = 0;
			for(i = 0; i < getdtablesize; i++)
            {
                close(i);
            }
			
			while(1)
            {
                周期性需要执行的事件;
                 
            }

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卓然主动防御系统分成四个模块,包含一个应用层可执行文件(.exe),四个内核层驱动(.sys),一个规则库数据库文件(.mdb),请保证六个文件在同一目录。应用层采用Visual Studio 2008(C )开发,驱动层开发环境为WDK 6001.18002、Notepad ,测试环境为VMware 6.0、Windows Xp Sp3。 开发目的 系统特性: 一. 使用RootiKit技术,精确拦截木马,曝光恶意行为 二. 提供详细行为描述信息,帮助用户判断 三. 云安全概念融入,精确判断文件安全级别 四. 支持白名单、黑名单,引入云规则,减少提醒 五. 多模块相互配合,将木马及其衍生物一网打尽 系统原理: 一. Hook SSDT 二.监视进程创建和销毁原理 三.监视注册表修改/创建原理 三.监视文件修改/创建原理 四.内存映射监控原理 五.云安全模块原理 六.规则动态加载原理 在云安全模块开启的情况下,本系统会自己向服务器验证加载进入内存的文件信息,与其它模块相互配合,可将病毒及期衍生物一网打荆 在 Windows NT 下,用户模式(User mode)的所有调用,如Kernel32.dll,User32.dll, Advapi32.dll等提供的API,最终都封装在Ntdll.dll中,然后通过Int 2E或SYSENTER进入到内核模式,通过服务ID,在System Service Dispatcher Table中分派系统函数。这些本地系统服务的地址在内核结构中称为系统服务调度表(System Service Dispatch Table,SSDT)中列出,该表可以基于系统调用编号进行索引,以便定位函数的内存地址。下图是Windows NT系列操作系统的体系结构,系统服务调用只是一个接口,它提供了将用户模式下的请求转发到Windows 2000内核的功能,并引发处理器模式的切换。在用户看来,系统服务调用接口就是Windows内核组件功能实现对外的一个界面。系统服务调用接口定义了Windows内核提供的大量服务。
1、面向对象的特征有哪些方面 (1). 封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 (2).继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 (3).多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 4、String 和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。 5、运行时异常与一般异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 7、说出ArrayList,Vector, LinkedList的存储性能和特性 ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。 SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。 对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。 对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。 Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。 9、Collection 和 Collections的区别。   Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 11、HashMap和Hashtable的区别。 HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。 12、final, finally, finalize的区别。   final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 13、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
RPC,全称为Remote Procedure Call,即远程过程调用,是一种计算机通信协议,它允许调用另一个地址空间(通常是一个共享网络的另一台计算机上)的过程或函数,就像调用本地过程或函数一样,而无需显式地编写远程调用的代码。 RPC涉及两个不同的进程,一个是客户端进程,另一个是服务器进程。当客户端需要调用一个远程过程时,它将发送一个请求消息到服务器进程服务器进程接收到请求消息后,执行请求的过程,并将结果返回给客户端。 RPC的实现涉及多个相关技术,包括: 1. 序列化框架:序列化是指将数据结构或对象转换为可传输格式的过程,例如XML、JSON、Protobuf等。在RPC中,序列化框架用于将参数和返回值序列化为字节流,并在客户端和服务器之间传输。 2. 传输协议:传输协议是指在RPC中用于传输消息的协议,例如TCP、HTTP、UDP等。传输协议必须提供可靠的消息传输,支持数据加密和压缩等特性。 3. 远程调用框架:远程调用框架是指在RPC中用于定义和实现远程服务接口的框架,例如Apache Thrift、gRPC等。 4. 服务注册与发现:服务注册与发现是指在RPC中用于管理和查询远程服务的框架,例如ZooKeeper、Consul等。 综上所述,RPC是一种基于网络的分布式系统通信协议,通过序列化和传输协议将客户端和服务器之间的消息传递,实现远程过程调用。同时,RPC的实现涉及多个相关技术,如序列化框架、传输协议、远程调用框架和服务注册与发现等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值