基于linux常用命令的操作系统是

papyros吧-百度贴吧--PapyrOS 是一个现代化的Linux操作系统--PapyrOS 是一个现代化的Linux操作系统,它遵循google material design的发行版,基于ARCH
签到排名:今日本吧第个签到,
本吧因你更精彩,明天继续来努力!
本吧排名:
本吧签到人数:9
可签7级以上的吧50个
本月漏签0次!
成为超级会员,赠送8张补签卡
连续签到:天&&累计签到:天
超级会员单次开通12个月以上,赠送连续签到卡3张
PapyrOS 是一个现代化的Linux操作系统
今天在官网看到的 百分之7
感觉已经死了,大家这么看。
大家怎么用的 怎么都没有一个像样子的教程啊 我都不会安装 怎么玩啊
唉,没有人管的项目就是这样随意。。。。大家等待吧 我发现了一个同样基于arch的Linux版本,大家可以试
网站还开着,但是不更新了?安装包到现在也没有。哎
目前还剩下两个bug,分别是键盘和窗口的问题。如果先解决键盘问题就直接把 window bug 推到 version 0.2 再解
简单而言,预测估计也是5月份左右才会真正的有关与iso的消息吧,所以,还是慢慢等~~
都已经开始0.3了,iso还不出〒_〒
应该还是会出的近期!
屁大点的事这几天忘了关注。刚刚打开一看0.3了,,这是开挂了么?
papyros Shell 刚安装好 报错 求解答。
创造和谐和高效的papyros吧,不具备任何技术效益的贴子还请大家往这里发布哦~
都来瞅瞅~ Papyros构建进度查询应用安卓版: http://yun.baidu.com/share/link?shareid=&uk=372937 不要在意比
为了本吧的长远发展,特调整吧主申请的条件,如有致力于本吧繁荣和papyros系统的发展的吧友皆可申请。
这么久了还不发布正式版 ——来自Windows3.0客户端
如题,不知道什么时候出ISO,焦急
96了 就要来了
今天去看,0%是几个意思
必须要支持papyrOS对不对?!
archlinux党前来参观话说开发进度又掉了
首先下载测试版镜像:dash.papyros.io/images/testing/ 然后我自己百度网盘的缓存:http://yun.baidu.com/share/link?shareid=&uk=3729
----------来自基于我大Linux的沈馨系统(Soulos),Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。~
怎么还没有出ISO啊
How about this booting concept? 赠送材质设计理念的安卓logo动画:
日迈克尔o斯宾塞 我们的愿景Papyros是建立一个Linux操作系统,是有趣和易于使用的普通用户。我
日迈克尔o斯宾塞 正如你们许多人可能已经注意到,我们的Bountysource活动最近消失了。这是因为
提供一种对papyros测试版系统img镜像文件的使用方法,但是最近一直在忙其他事也没有经过测试,chrome的时候用过这种方法,我想都应该大同小异。 只需
papyros是一个基于QT和QML的,符合google材料设计的操作系统,软件包管理器基于archlinux创建的,因此可以看作是archlinux系的操作系统,papyros目前
Version 2 of my mockup!! 依据所有的咨询和投诉,以前的设计模板的评论,和质感材料的设计准则。这个新的版本基于相同的设计理念,重新开始重新设计
那个安全启动太坑了,除了含有Microsoft证书的UEFI启动文件才能启动,papyros到底有没有UEFI证书?(自从安装了UBUNTU,BIOS就再无明日了)
==================================== 本帖转载自archlinux吧 @今天手气不错啊 ==================================== Virtualbox是一款优秀的虚拟机
好喜庆,突然就上来了
PS:最后附原生壁纸一张,反正我估计今年第一个版本是没什么希望了。
----------来自基于我大Linux的沈馨系统(Soulos),Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。~
发贴红色标题
签到六倍经验
兑换本吧会员
赠送补签卡1张,获得
助攻总额: 43W
发表后自动分享本贴
使用签名档& 上传我的文档
 上传文档
 下载
 收藏
粉丝量:738
该文档贡献者很忙,什么也没留下。
 下载此文档
操作系统课程设计--基于Linux的模拟文件系统的设计与实现
下载积分:850
内容提示:操作系统课程设计--基于Linux的模拟文件系统的设计与实现
文档格式:DOC|
浏览次数:254|
上传日期: 18:22:08|
文档星级:
全文阅读已结束,如果下载本文需要使用
 850 积分
下载此文档
该用户还上传了这些文档
操作系统课程设计--基于Linux的模拟文件系统的设计与实现
关注微信公众号基于Linux的实时操作系统的分析与研究_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于Linux的实时操作系统的分析与研究
阅读已结束,下载本文需要
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩6页未读,
定制HR最喜欢的简历
你可能喜欢&1.关于进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块三部分组成。
多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
在windows系统中查看进程:
2.关于Linux
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
源码地址:https://elixir.bootlin.com/linux/v4.6/source
在Linux系统(ubuntu)中查看进程:
3.Linux系统组织进程
Linux通过task_struct结构体来描述一个进程的所有信息,结构体被定义在&include/linux/sched.h中。
task_struct结构体即是PCB。PCB是进程的唯一标识,PCB由链表实现(为了动态插入和删除)。进程创建时,为该进程生成一个PCB;进程终止时,回收PCB。
PCB包含信息:
进程状态(State)
进程调度信息
进程通信有关信息
进程链接信息
时间和定时器信息
文件系统信息
虚拟内存信息
页面管理信息
对称多处理机(SMP)信息
和处理器相关的环境(上下文)信息
部分代码:
struct task_struct {
volatile long
//进程状态
//内存指针
unsigned int
//进程标号(进程名字)
unsigned int
//BLK 锁深度
#ifdef CONFIG_SMP
#ifdef __ARCH_WANT_UNLOCKED_CTXSW
//配置多核多线程
int prio, static_prio, normal_
//进程的优先级
unsigned int rt_
//实时进程的优先级
const struct sched_class *sched_
//调度器的指针
struct sched_
//调度器 实例化的对象
struct sched_rt_
//实时 调度器的一个对象
#ifdef CONFIG_PREEMPT_NOTIFIERS
//配置抢占通知器
/* struct preempt_notifier列表 */
struct hlist_head preempt_
/*fpu_count 里面内容是如果一个浮点运算器被使用,它记录着连续的上下文切换的次数,如果fpu_Count超过一个
临界值,不怎么工作的FPU会火力全开以至于当fpu_count超过 256次后才变得闲置下来,为了解决这个问题,FPU
仅仅使用一段时间 */
unsigned char fpu_
//定义 fpu_count
#ifdef CONFIG_BLK_DEV_IO_TRACE
//配置 BLK 锁开发版的输入输出跟踪器
unsigned int btrace_
unsigned int
cpumask_t cpus_
#ifdef CONFIG_TREE_PREEMPT_RCU
//配置抢占树,抢占的结构体的读写机制,即RCU机制。
int rcu_read_lock_
char rcu_read_unlock_
struct rcu_node *rcu_blocked_
struct list_head rcu_node_
#endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */
#if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT)
struct sched_info sched_
//调度器的状态
struct list_
struct plist_node pushable_
struct mm_struct *mm, *active_
//虚拟地址空间的结构体
          
//进程退出时getpid 就获取status就是它。
//task 状态 ,正常退出状态
int exit_code, exit_
//退出信号
int pdeath_
//当成为孤儿进程时发送信号
unsigned int
//表明进程的状态
unsigned did_exec:<span style="color: #;
unsigned in_execve:<span style="color: #; //第一个表已经调过了exec族函数,已经发生了进程的程序替换 第二个代表该进程正在调用execve函数 第三个 正在等待i/o设备 第四个 表示当fork生成子进程时,是否恢复了进程的默认优先级
unsigned in_iowait:<span style="color: #;
/* 在分叉时恢复默认优先级/策略*/
unsigned sched_reset_on_fork:<span style="color: #;
#ifdef CONFIG_CC_STACKPROTECTOR
//配置堆栈保护措施
unsigned long stack_
//canary值 保护编译器 防止堆栈溢出 导致的返回地址被填充
struct task_struct *real_
struct task_struct *
struct list_
//子节点和兄弟节点的定义
struct list_
struct task_struct *group_
//线程组的头结点
struct list_
//跟踪器的头结点,跟踪器 跟踪 进程的逻辑流,即PC指令流
struct list_head ptrace_
struct pid_link pids[PIDTYPE_MAX];
//定义 PID_LINK 结构体用它通过PID在哈希散列表中查找相应的task_struct
struct list_head thread_
//用来保存线程组的PID
struct completion *vfork_
int __user *set_child_
//指向用户创造创立的线程的TID号
int __user *clear_child_
//指向被清除的线程的TID号
cputime_t utime, stime, utimescaled,
cputime_t prev_utime, prev_
unsigned long nvcsw,
//上下文切换的次数
struct timespec start_
struct timespec real_start_
unsigned long min_flt, maj_
struct task_cputime cputime_
struct list_head cpu_timers[<span style="color: #];
const struct cred *real_
const struct cred *
struct mutex cred_guard_
struct cred *replacement_session_
char comm[TASK_COMM_LEN];
                      
//文件系统信息
int link_count, total_link_
#ifdef CONFIG_SYSVIPC
//配置进程的通信机制
struct sysv_
#ifdef CONFIG_DETECT_HUNG_TASK
unsigned long last_switch_
struct thread_
//CPU特殊状态的测试,线程结构体
struct fs_struct *
//fs 指向一个文件系统信息结构体,该结构体有文件系统的信息
     //指向记录打开文件信息的 结构体
struct files_struct *
//命名空间的定义
struct nsproxy *
//配置进程的信号处理
struct signal_struct *
//以下是普通信号部分
struct sighand_struct * //这个指向 handler表
sigset_t blocked, real_
//这个表示进程的屏蔽字
sigset_t saved_
struct //pending表
unsigned long sas_ss_
// 以下是实时信号部分
size_t sas_ss_
int (*notifier)(void *priv);
void *notifier_
sigset_t *notifier_
struct audit_context *audit_
#ifdef CONFIG_AUDITSYSCALL
// 配置系统调用
unsigned int
#ifdef CONFIG_UTRACE
struct utrace *
unsigned long utrace_
u32 parent_exec_
u32 self_exec_
/* 配置器保护措施配置
spinlock_t alloc_
#ifdef CONFIG_GENERIC_HARDIRQS
struct irqaction *
spinlock_t pi_
#ifdef CONFIG_RT_MUTEXES
// 互斥的配置
struct plist_head pi_
struct rt_mutex_waiter *pi_blocked_
#ifdef CONFIG_LOCKDEP
// 死锁模块的配置
# define MAX_LOCK_DEPTH <span style="color: #UL
u64 curr_chain_
int lockdep_
unsigned int lockdep_
struct held_lock held_locks[MAX_LOCK_DEPTH];
gfp_t lockdep_reclaim_
// 文件系统的日志信息
void *journal_
struct bio *bio_list, **bio_
//VM 虚拟机的状态
struct reclaim_state *reclaim_
struct backing_dev_info *backing_dev_
struct io_context *io_
unsigned long ptrace_
siginfo_t *last_
struct task_io_
#ifdef CONFIG_CPUSETS
nodemask_t mems_
//定义一个结构体 标志 内存是否允许访问 保护配置器的锁的
#ifndef __GENKSYMS__
unsigned short cpuset_mem_spread_
unsigned short cpuset_slab_spread_
int mems_allowed_change_
int cpuset_mem_spread_
int cpuset_slab_spread_
#ifdef CONFIG_CGROUPS // 配置控制组信息
struct css_set *
struct list_head cg_
3.1进程的创建
  新进程的创建,首先在内存中为新进程创建一个task_struct结构,然后将父进程的task_struct内容复制其中,再修改部分数据。分配新的内核堆栈、新的PID、再将task_struct 这个node添加到链表中。所谓创建,实际上是“复制”。
  子进程刚开始,内核并没有为它分配物理内存,而是以只读的方式共享父进程内存,只有当子进程写时,才复制。
fork函数:调用一次,返回两次。在父进程和子进程中各调用一次。子进程中返回值为0,父进程中返回值为子进程的PID。根据返回值的不同让父进程和子进程执行不同的代码。一个父进程希望子进程同时执行不同的代码段,这在网络服务器中常见——父进程等待客户端的服务请求,当请求到达时,父进程调用fork,使子进程处理此请求。一个进程要执行一个不同的程序,一般fork之后立即调用exec。
#include &unistd.h&
pid_t fork(void);
vfork函数:vfork与fork对比,返回值相同。不同在于,fork创建子进程,把父进程数据空间、堆和栈复制一份;vfork创建子进程,与父进程内存数据共享;vfork先保证子进程先执行,当子进程调用exit()或者exec后,父进程才往下执行。用vfork时,一般都是紧接着调用exec,所以不会访问父进程数据空间,也就不需要在把数据复制上花费时间了。
#include &unistd.h&
pid_t vfork(void);
3.2进程的终止
正常终止(5种):
从main返回,等效于调用exit
exit 首先调用各终止处理程序,然后按需多次调用fclose,关闭所有的打开流。
调用_exit或者_Exit
最后一个线程从其启动例程返回
最后一线程调用pthread_exit
异常终止(3种):
接到一个信号并终止
最后一个线程对取消请求作出响应
4.进度状态
进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型中,进程状态分为三个基本状态,即运行态,就绪态,阻塞态。在五态模型中,进程分为新建态、终止态,运行态,就绪态,阻塞态。
Linux中的进程状态主要有如下表示:
TASK_RUNNING
TASK_INTERRUPTIBLE
可中断的等待状态
TASK_UNINTERRUPTIBLE
不可中断的等待状态
TASK_ZOMBIE
TASK_STOPPED
TASK_SWAPPING
进程状态转换图:
      
5.进程调度
无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
基本属性:
多态性 从诞生、运行,直至消灭。
多个不同的进程可以包括相同的程序
三种基本状态 它们之间可进行转换
并发性并发执行的进程轮流占用处理器
Linux调度器的演变:
  CFS 背后的主要想法是维护为任务提供处理器时间方面的平衡(公平性)。这意味着应给进程分配相当数量的处理器。分给某个任务的时间失去平衡时(意味着一个或多个任务相对于其他任务而言未被给予相当数量的时间),应给失去平衡的任务分配时间,让其执行。
  要实现平衡,CFS 在叫做虚拟运行时的地方维持提供给某个任务的时间量。任务的虚拟运行时越小, 意味着任务被允许访问服务器的时间越短 — 其对处理器的需求越高。CFS 还包含睡眠公平概念以便确保那些目前没有运行的 任务(例如,等待 I/O)在其最终需要时获得相当份额的处理器。
  但是与之前的 Linux 调度器不同,它没有将任务维护在运行队列中,CFS 维护了一个以时间为顺序的红黑树(如下图)。&红黑树是一个树,具有很多有趣、有用的属性。首先,它是自平衡的,这意味着树上没有路径比任何其他路径长两倍以上。 第二,树上的运行按 O(log&n) 时间发生(其中&n&是树中节点的数量)。这意味着可以快速高效地插入或删除任务。
  任务存储在以时间为顺序的红黑树中(由&sched_entity&对象表示),对处理器需求最多的任务 (最低虚拟运行时)存储在树的左侧,处理器需求最少的任务(最高虚拟运行时)存储在树的右侧。 为了公平,调度器然后选取红黑树最左端的节点调度为下一个以便保持公平性。任务通过将其运行时间添加到虚拟运行时, 说明其占用 CPU 的时间,然后如果可运行,再插回到树中。这样,树左侧的任务就被给予时间运行了,树的内容从右侧迁移到左侧以保持公平。 因此,每个可运行的任务都会追赶其他任务以维持整个可运行任务集合的执行平衡。
task_struct任务结构和红黑树的结构层次
  树的根通过&rb_root&元素通过&cfs_rq&结构(在 ./kernel/sched.c 中)引用。红黑树的叶子不包含信息,但是内部节点代表一个或多个可运行的任务。红黑树的每个节点都由&rb_node&表示,它只包含子引用和父对象的颜色。&rb_node&包含在&sched_entity&结构中,该结构包含&rb_node&引用、负载权重以及各种统计数据。最重要的是,sched_entity&包含&vruntime(64 位字段),它表示任务运行的时间量,并作为红黑树的索引。 最后,task_struct&位于顶端,它完整地描述任务并包含&sched_entity&结构。
  就 CFS 部分而言,调度函数非常简单。 在 ./kernel/sched.c 中,有通用&schedule()&函数,它会先抢占当前运行任务(除非它通过&yield()&代码先抢占自己)。注意 CFS 没有真正的时间切片概念用于抢占,因为抢占时间是可变的。 当前运行任务(现在被抢占的任务)通过对&put_prev_task&调用(通过调度类)返回到红黑树。 当schedule&函数开始确定下一个要调度的任务时,它会调用&pick_next_task&函数。此函数也是通用的(在 ./kernel/sched.c 中),但它会通过调度器类调用 CFS 调度器。 CFS 中的&pick_next_task&函数可以在 ./kernel/sched_fair.c(称为&pick_next_task_fair())中找到。 此函数只是从红黑树中获取最左端的任务并返回相关&sched_entity。通过此引用,一个简单的&task_of()&调用确定返回的&task_struct&引用。通用调度器最后为此任务提供处理器。
优先级和CFS:CFS 不直接使用优先级而是将其用作允许任务执行的时间的衰减系数。 低优先级任务具有更高的衰减系数,而高优先级任务具有较低的衰减系数。 这意味着与高优先级任务相比,低优先级任务允许任务执行的时间消耗得更快。 这是一个绝妙的解决方案,可以避免维护按优先级调度的运行队列。
跟CFS有关进程:
创建新进程: 创建新进程时, 需要设置新进程的vruntime值以及将新进程加入红黑树中. 并判断是否需要抢占当前进程。
进程唤醒: 唤醒进程时, 需要调整睡眠进程的vruntime值, 并且将睡眠进程加入红黑树中. 并判断是否需要抢占当前进程。
进程的调度: 进程调度时, 需要把当前进程加入红黑树中, 还要从红黑树中挑选出下一个要运行的进程。
时钟周期中断: 在时钟中断周期函数中, 需要更新当前运行进程的vruntime值, 并判断是否需要抢占当前进程。
部分代码:
   &&完全公平运行队列:描述运行在同一个cpu上的处于TASK_RUNNING状态的普通进程的各种运行信息
struct cfs_rq {
struct load_
//运行队列总的进程权重
unsigned int nr_running, h_nr_ //进程的个数
//运行的时钟
u64 min_ //该cpu运行队列的vruntime推进值, 一般是红黑树中最小的vruntime值
struct rb_root tasks_ //红黑树的根结点
struct rb_node *rb_
//指向vruntime值最小的结点
//当前运行进程, 下一个将要调度的进程, 马上要抢占的进程,
struct sched_entity *curr, *next, *last, *
struct rq * //系统中有普通进程的运行队列, 实时进程的运行队列, 这些队列都包含在rq运行队列中
调度实体:记录一个进程的运行状态信息
struct sched_entity {
struct load_ //进程的权重
struct rb_node
run_ //运行队列中的红黑树结点
struct list_head
group_ //与组调度有关
unsigned int
on_ //进程现在是否处于TASK_RUNNING状态
exec_ //一个调度tick的开始时间
sum_exec_ //进程从出生开始, 已经运行的实际时间
u64 //虚拟运行时间
prev_sum_exec_ //本次调度之前, 进程已经运行的实际时间
struct sched_entity * //组调度中的父进程
struct cfs_rq
*cfs_ //进程此时在哪个运行队列中
创建进程,设置新进程的vruntime值,task_fork_fair()函数部分代码:
static void task_fork_fair(struct task_struct *p)
struct cfs_rq *cfs_
struct sched_entity *se = &p-&se, *
int this_cpu = smp_processor_id();
struct rq *rq = this_rq();
unsigned long
raw_spin_lock_irqsave(&rq-&lock, flags);
update_rq_clock(rq);
cfs_rq = task_cfs_rq(current);
curr = cfs_rq-&
rcu_read_lock();
__set_task_cpu(p, this_cpu); //设置新进程在哪个cpu上运行
rcu_read_unlock();
update_curr(cfs_rq); //更新当前进程的vruntime值
se-&vruntime = curr-& //先以父进程的vruntime为基础
place_entity(cfs_rq, se, <span style="color: #); //设置新进程的vruntime值, 1表示是新进程
if (sysctl_sched_child_runs_first && curr && entity_before(curr, se)) { //sysctl_sched_child_runs_first值表示是否设置了让子进程先运行
swap(curr-&vruntime, se-&vruntime); //当子进程的vruntime值大于父进程的vruntime时, 交换两个进程的vruntime值
resched_task(rq-&curr); //设置重新调度标志TIF_NEED_RESCHED
se-&vruntime -= cfs_rq-&min_ //防止新进程运行时是在其他cpu上运行的, 这样在加入另一个cfs_rq时再加上另一个cfs_rq队列的min_vruntime值即可(具体可以看enqueue_entity函数)
raw_spin_unlock_irqrestore(&rq-&lock, flags);
进程的主动调度函数是schedule():
asmlinkage void __sched schedule(void)
struct task_struct *prev, *
unsigned long *switch_
struct rq *
need_resched:
preempt_disable(); //在这里面被抢占可能出现问题,先禁止它!
cpu = smp_processor_id();
rq = cpu_rq(cpu);
rcu_qsctr_inc(cpu);
prev = rq-&
switch_count = &prev-&
release_kernel_lock(prev);
need_resched_nonpreemptible:
spin_lock_irq(&rq-&lock);
update_rq_clock(rq);
clear_tsk_need_resched(prev); //清除需要调度的位
if (prev-&state && !(preempt_count() & PREEMPT_ACTIVE)) {
if (unlikely(signal_pending_state(prev-&state, prev)))
prev-&state = TASK_RUNNING;
deactivate_task(rq, prev, <span style="color: #);
//出队, 此处主要是把prev-&on_rq赋值为0, 因为当前进程本来就没在红黑树中. on_rq为0后, 后面的put_prev_task函数就不会把当前进程加入红黑树了
switch_count = &prev-&
if (unlikely(!rq-&nr_running))
idle_balance(cpu, rq);
prev-&sched_class-&put_prev_task(rq, prev);
//把当前进程加入红黑树中
next = pick_next_task(rq, prev);
//从红黑树中挑选出下一个要运行的进程, 并将其设置为当前进程
if (likely(prev != next)) {
sched_info_switch(prev, next);
rq-&nr_switches++;
rq-&curr =
++*switch_
//完成进程切换
context_switch(rq, prev, next);
cpu = smp_processor_id();
rq = cpu_rq(cpu);
spin_unlock_irq(&rq-&lock);
if (unlikely(reacquire_kernel_lock(current) & <span style="color: #))
goto need_resched_
preempt_enable_no_resched();
//这里新进程也可能有TIF_NEED_RESCHED标志,如果新进程也需要调度则再调度一次
if (unlikely(test_thread_flag(TIF_NEED_RESCHED)))
goto need_
6.对Linux系统进程模型的看法
  进程是操作系统的核心之一,对于 Linux 技术而言,惟一不变的就是永恒的变化,不断追求更优更有效率的算法,让计算机给人们提供更好的服务。我们从进程模型中学习到的理论知识与算法的更新模式等,都应与现实结合,好好实践。
7.参考资料
https://baike.baidu.com/item/%E8%BF%9B%E7%A8%8B/382503?fr=aladdin
https://baike.baidu.com/item/linux/27050
https://www.cnblogs.com/hanxiaoyu/p/5549212.html
https://baike.baidu.com/item/%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6
&https://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/index.html?ca=drs-cn-0125
阅读(...) 评论()查看: 16787|回复: 22
手机基于Linux的操作系统,为什么成功的是是android?
头像被屏蔽
更多精彩专业军事内容,期待你的加入!
才可以下载或查看,没有帐号?
&&之前有Meego,Limo,后来头tizen,前两者都是昙花一现,后者现在估计也是苦苦挣扎,只有google的android成功,为何?
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
超大游击队员
资本与利润的结合,加上雄心壮志的推动。
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
安卓推出的时机很好,苹果开启了智能手机的时代,广大手机厂商迫切需要一个与iOS抗衡的操作系统,于是谷歌推出安卓。更关键的是安卓构建出自己的生态链,系统烂可以慢慢改,只要有人用,就会占领市场。安卓开始做得很差的,但是推广开了,很多手机厂商预装,也有很多开发者为其制作应用,形成了一个庞大的产业联盟。微软的wp系统并不差,但是生态一直没发展起来,用户找不到应用,就会放弃它。用户越来越少,开发者积极性受挫,更没有好应用,这样恶性循环,变成现在这种半死不活的模样。
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
头像被屏蔽
超大游击队员
iOS不是基于Linux?
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
超大游击队员
杨威利0607 发表于
iOS不是基于Linux?
IOS不算基于Linux,是基于UNIX的,和Linux是姐妹关系
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
IOS成功的一部分原因是很多人对塞班系统已经厌烦了,楼主你说的那些系统都是比较像塞班而不是像IOS,这基本上就是原因,就生态系统而言当时就干不过塞班,又没有什么本质性的改变,会成功才有鬼。
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
本帖最后由 oldwatch 于
15:52 编辑
第一个关键是爹好,支持力度旁人没法比(meego在n记没享受到啥待遇)
第二个是恰逢其时,手机商需要一个开放系统对抗iOS,新一代塞班N记自己都没拾掇利索,而android许可证远比塞班松弛
第三,android做了很多底层驱动封装之类的力气活,这是开源社区或者单个小厂商无力支持的大工程
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
谷歌的号召力和持续投入。
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
超大游击队员
本帖最后由 怒放的菊花 于
22:28 编辑
当时摩托罗拉的Linux系统机子什么e2,e680,e6,e8,zn5,em35可是很好很强大,各顶个的经典。
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
超大游击队员
怒放的菊花 发表于
当时摩托罗拉的Linux系统机子什么e2,e680,e6,e8,zn5,em35可是很好很强大,各顶个的经典。
我好喜欢e680和它的十一块电池
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
超大游击队员
主要是免费,就像arm架构门槛低进的人自然就多
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
头像被屏蔽
超大游击队员
vayblin 发表于
IOS不算基于Linux,是基于UNIX的,和Linux是姐妹关系
Linux还不是基于Unix
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
超大游击队员
马甸 发表于
Linux还不是基于Unix
Linux和UNIX可以认为是两种系统,就好像APPLE的MACOS基于的FreeBSD和UNIX是两个系统一样
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
超大游击队员
马甸 发表于
Linux还不是基于Unix
linux是用完全不同的代码重构了unix的功能,并不算是基于unix
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
头像被屏蔽
超大游击队员
oldwatch 发表于
Linux和UNIX可以认为是两种系统,就好像APPLE的MACOS基于的FreeBSD和UNIX是两个系统一样
但是Linux的实现原理还是基于Unix.只要会U就会L
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
当时摩托罗拉的Linux系统机子什么e2,e680,e6,e8,zn5,em35可是很好很强大,各顶个的经典。
用过 E6,容易死机,不过握持手感非常舒服
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
超大游击队员
逸仙润之尊仲尼 发表于
我好喜欢e680和它的十一块电池
哈哈…我懂得!
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
超大游击队员
马甸 发表于
但是Linux的实现原理还是基于Unix.只要会U就会L
操作界面和技术实现完全两回事
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
IOS不算基于Linux,是基于UNIX的,和Linux是姐妹关系
严格说也不是UNIX,是FreeBSD,类UNIX家族的。
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
Linux还不是基于Unix
这句话错得离谱。
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
头像被屏蔽
超大游击队员
involute 发表于
这句话错得离谱。
Unix的工作原理是现在分时系统的鼻祖
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
超大游击队员
真要找爹的话,unix本身还是从MULTICS项目精简下来的实现,砍掉了很多多用户多进程的需求
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
Unix的工作原理是现在分时系统的鼻祖
就如同说WPS是基于WORD开发一样无厘头。
不错,它们很像,兼容性还不错,但是完全没有亲缘关系。
最具影响力军事论坛-超级大本营军事论坛欢迎你!超然物外,有容乃大。
声明:论坛言论仅代表网友个人观点,不代表超级大本营军事网站立场
Powered by Discuz &
超级大本营军事网站
(违法及不良信息举报电话:)
最具影响力中文军事论坛 - Most Influential Chinese Military Forum}

我要回帖

更多关于 深入理解linux内核 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信