变量操作变量显示(echo)语法:echo $var 变量设置语法:var=value 变量的设置规则1.变量两端不能直接接空格符2.变量名称只能是因为字母与数字,但开头不能使数字3.双引号内的特殊字符如$等,保持原本特性[root@bogon ~]# var="lang is $LANG"[root@bogon ~]# echo %varroot@bogon ~]# echo $varlang is zh_CN.UTF-81.
数据流可以分为2种:输入数据流:以写文件为例,从键盘输入的字符就输入数据流输出数据流:以读文件为例,将文件内容显示到屏幕上,显示的内容就是输出字符流数量流重定向就是指改变数据流输入的方式或输出的介质。比如,输入数据流可以是一个文件的内容,输出数据流介质可以是文件而不单单的屏幕 对于命令行来说输入数据流主要来自键盘,输出数据流只要介质是屏幕。
选取命令:cut,grep排序命令:sort,wc,uniq双重数据量:tee字符转换命令:tr,expand,col切割命令:split参数代换:xargs管道命令与连续命令不同,连续命令中的各个命令不存在相关性只是顺序执行。对于管道命令来说 cmd1|cmd2.
shell script 是利用 shell 的功能所写的一个程序,这个程序使用纯文本文件,将一些 shell 的语法和命令写在里面,搭配正则表达式,管道命令与数据流重定向等功能,达到我们想要的目的shell script 执行直接命令执行shell script 文件必须具备 rx 的权限,假设 my.sh 在 /root 下绝对路径[root@bogon ~]# /root/my.sh相对路径[root@bogon ~]# . /my.
ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户 rpm:redhat package manager 红帽子打包管理器 pwd:print work directory 打印当前目录显示出当前工作目录的绝对路径 ps: process status(进程状态,类似于 windows 的任务管理器) 常用参数:-auxfps -auxf 显示进程状态 df: disk free 其功能是显示磁盘可用空…
对于 Linux 来说正规的文件系统为 EXT2,一个文件系统存储的数据通常包括文件权限和属性,以及文件数据,这两部分分别存储在不同的地方。
系统平均负载:是处于可运行或不可中断状态的平均进程数。可运行进程:使用 CPU 或等待使用 CPU 的进程,不可中断状态进程:正在等待某些 IO 访问,一般是和硬件交互,不可被打断(不可被打断的原因是为了保护系统数据一致,防止数据读取错误)
即便是在多核处理器的计算机上,进程的数量通常也是远远多于处理器数量的。因此,宏观上并行运行的多个进程在微观上往往属于分时复用。进程调度的本质是怎么样让进程更好地分时复用处理器资源。概括地说,进程调度包括调度策略和进程切换两个重要话题。针对一个处理器来说,分时复用无非就是A进程的时间配额用完以后换到B进程的事情。在这个场景下,“如何选择B进程”就是调度策略,“如何运行B进程”就是进程切换。
我打算让volumio运行在我2009年购买的老爷机笔记本上,也让它发挥一点余温热。正常操作是将volumio的系统镜像刷到U盘上,连接电脑后使用U盘启动系统即可。但是家里没有找到合适的U盘(穷~~),加上前段时间听了同事关于linux内核的分享,感慨自己对系统的理解不够。因此我决定使用无盘启动volumio顺便研究一下linux启动原理。
如今的网络应用早已从 CPU 密集型转向了 I/O 密集型,网络服务器大多是基于 C-S 模型,也即 客户端 - 服务端 模型,客户端需要和服务端进行大量的网络通信,这也决定了现代网络应用的性能瓶颈:I/O。
最后一章列举本文参考过的书籍和项目,欢迎大家补充和讨论更多有关进程的知识。
Cgroups全称Control Groups,是Linux内核用于资源隔离的技术。目前Cgroups可以控制CPU、内存、磁盘访问。使用Cgroups是在Linux 2.6.24合并到内核的,不过项目在不断完善,3.8内核加入了对内存的控制(kmemcg)。要使用Cgroups非常简单,阅读前建议看sysadmincasts的视频,https://sysadmincasts.com/episodes/14-introduction-to-linux-control-groups-cgroups。
Epoll是poll的改进版,更加高效,能同时处理大量文件描述符,跟高并发有关,Nginx就是充分利用了epoll的特性。讲这些没用,我们先了解poll是什么。PollPoll本质上是Linux系统调用,其接口为int poll(struct pollfd *fds,nfds_t nfds, int timeout),作用是监控资源是否可用。
我们要想启动一个进程,需要操作系统的调用(system call)。实际上操作系统和普通进程是运行在不同空间上的,操作系统进程运行在内核态(todo: kernel space),开发者运行的进程运行在用户态(todo: user space),这样有效规避了用户程序破坏系统的可能。如果用户态进程想执行内核态的操作,只能通过系统调用了。
我们知道信号是进程间通信的其中一种方法,当然也可以是内核给进程发送的消息,注意信息只是告诉进程发生了什么事件,而不会传递任何数据。这是进程这个概念设计时就考虑到的了,因为我们希望控制进程,就像一个小孩我们想他按我们的想法做,前提就是他能够接受信号并且理解信号的含义。
IPC全称Interprocess Communication,指进程间协作的各种方法,当然包括共享内存,信号量或Socket等。管道(Pipe)管道是进程间通信最简单的方式,任何进程的标准输出都可以作为其他进程的输入。信号(Signal)下面马上会介绍。消息队列(Message)和传统消息队列类似,但是在内核实现的。共享内存(Shared Memory)后面也会有更详细的介绍。
当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。理解了孤儿进程和僵尸进程,我们临时加了守护进程这一小节,守护进程就是后台进程吗?
本章开始时演示了Hello World程序,其实已经创建了新的进程,通过Bash或者zsh这些Shell很容易创建新的进程,但Shell本身是怎么实现的呢?我们又能不能用Go实现类似Shell的功能呢?系统调用原来这一切都是操作系统给我们做好的,然后暴露了使用的API接口,这就是系统调用。
在Linux中“一切皆文件”,进程的一切运行信息(占用CPU、内存等)都可以在文件系统找到,例如看一下PID为1的进程信息。
任何进程退出时,都会留下退出码,操作系统根据退出码可以知道进程是否正常运行。退出码是0到255的整数,通常0表示正常退出,其他数字表示不同的错误。示例程序package mainfunc main() { panic("Call panic()")}运行结果root@fa13d0439d7a:/go/src# go run exit_code.gopanic: Call panic()goroutine 16 [running]:runtime.
关注时代Java